package cn.zcy.controller.intercept;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;

public class MyInterceptorController implements HandlerInterceptor {
    /**
     * 在处理方法之前执行 日志， 权限，记录时间
     * @param request 可以在方法进来之前更改request中的属性值
     * @param response
     * @param handler 分装了当前处理方法的信息（哪一个方法，哪一个类，方法中所有的参数）
     * @return true 后续的调用链正常执行 /false 中断执行
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //java.lang.ClassCastException: org.springframework.web.servlet.mvc.ParameterizableViewController
        // cannot be cast to org.springframework.web.method.HandlerMethod
        if (handler instanceof HandlerMethod){

            HandlerMethod handlerMethod=(HandlerMethod)handler;


        System.out.println("类["+handlerMethod.getBean().getClass().getName()+"]" +
                "方法名["+handlerMethod.getMethod().getName()+"]" +
                "参数["+ Arrays.toString(handlerMethod.getMethod().getParameters())+"]" +
                "执行前执行-----------preHandle");
        }
        return true;
    }

    /**
     * 如果preHandle 方法中断不会执行该方法
     * 请求执行后执行，在视图渲染之前执行
     * 当处理方法出现了异常则不会执行方法
     * @param request
     * @param response 可以在方法执行后去更改response中的信息
     * @param handler 分装了当前处理方法的信息（哪一个方法，哪一个类，方法中所有的参数）
     * @param modelAndView 封装了model和view
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("方法后执行，在渲染之前-----------postHandle");
    }

    /**
     * 如果preHandle 方法中断不会执行该方法
     *在试图渲染之后执行 ，相当于  try catch finally 中的 finally ，出现异常也会执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex 异常  Exception 记录异常日志 ，清除资源
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("渲染之后执行-----------postHandle");
    }
}
